iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
Security

從0開始的打Pwn教學系列 第 18

【Day-18】程式結束後去哪了 - 1

  • 分享至 

  • xImage
  •  

最後我們來看一整支程式結束時的樣子,GDB是寫leave ret,意思其實與IDA的ADD RSP,xxh
POP RBP
Return
一樣,
只是並非使用ADD,而是MOV RSP,RBP

我們先來看GDB,由於GDB是把兩個指令寫在leave中,所以會有兩個變化,當執行完leave後,RSP和RBP應該會是一樣的值,然後Stack當中的會有一個Address消失跑去暫存器中的RBP。

可以看到原本是SUB RSP,0x10,因此Leave的第一個指令是ADD RSP,0x10,所以會與目前的RBP一樣位址,然後Stack當中的Old RBP會放到現在的RBP當中。
https://ithelp.ithome.com.tw/upload/images/20241002/20169016BWBaQARvDI.jpg

這邊發現RSP的Address是de88,也就是原本的de70加上0x10後再加上POP RBP後總共0x18。
那為什麼RBP顯示0x0呢,這其實是Linux 下GDB的一個設定,在我們執行的程式還沒進入前RBP的設定是0x0,因此就算程式結束了,RBP跳轉的位址也會是0x0。
https://ithelp.ithome.com.tw/upload/images/20241002/20169016RjVBELTENt.jpg

最後做ret後,會發現跳去了一個叫libc-start.c的地方,這就是Call我們這支程式前的程式了。
https://ithelp.ithome.com.tw/upload/images/20241002/20169016AEPVWQVPpL.jpg
https://ithelp.ithome.com.tw/upload/images/20241002/20169016aVCD4DkYyO.png

下次我們來說IDA的程式結束會長怎樣。


上一篇
【Day-17】Function Call 結束時的變化
下一篇
【Day-19】程式結束後去哪了 - 2
系列文
從0開始的打Pwn教學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言